/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bettosimport.controllers;

import com.bettosimport.entidades.Comprobante_compra;
import com.bettosimport.entidades.Detalle_compra;
import com.bettosimport.entidades.Familia;
import com.bettosimport.entidades.Linea;
import com.bettosimport.entidades.Producto;
import com.bettosimport.entidades.Producto_Precio;
import com.bettosimport.entidades.Proveedor;
import com.bettosimport.entidades.Sucursal_Producto;
import com.bettosimport.entidades.Tipo_comprobante;
import com.bettosimport.entidades.Usuario;
import com.bettosimport.negocio.ComprobanteCompraNeg;
import com.bettosimport.negocio.ProductoNeg;
import com.bettosimport.negocio.ProveedorNeg;
import com.bettosimport.negocio.TablasMaestrasNeg;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;

/**
 *
 * @author Neil
 */
@Controller
@SessionAttributes({"user", "detCompra"})
public class OperacionesController {

    @RequestMapping(value = "/detproducto", method = RequestMethod.GET)
    public String productos(ModelMap map) {
        map.addAttribute("titulo", "Productos - Stock - Precios");
        try {
            Map<String, String> lineas;
            Map<String, String> familias;
            lineas = new LinkedHashMap<>();
            familias = new LinkedHashMap<>();
            for (Linea l : TablasMaestrasNeg.Instancia().lineas()) {
                lineas.put(String.valueOf(l.getId_linea()), l.getDesc_linea());
            }
            for (Familia l : TablasMaestrasNeg.Instancia().familias(0)) {
                familias.put(String.valueOf(l.getId_fam()), l.getDesc_fam());
            }
            map.addAttribute("lineas", lineas);
            map.addAttribute("familias", familias);
            map.addAttribute("sucprod", ProductoNeg.Instancia().productos(0, 0, 0));
        } catch (Exception ex) {
        }
        return "logistica/detalleProducto";
    }

    @RequestMapping(value = "/precios/{prod}", method = RequestMethod.GET)
    public @ResponseBody
    ArrayList<Producto_Precio> precios(@PathVariable(value = "prod") int prod, HttpSession sesion, ModelMap map) {
        int suc = (int) ((Object[]) sesion.getAttribute("user"))[3];
        ArrayList<Producto_Precio> precios = null;
        try {
            precios = ProductoNeg.Instancia().preciosDeProductos(suc, prod);
        } catch (Exception ex) {
        }
        return precios;
    }

    @RequestMapping(value = "/stock/{prod}", method = RequestMethod.GET)
    public @ResponseBody
    ArrayList<Sucursal_Producto> stock(@PathVariable(value = "prod") int prod, ModelMap map) {
        ArrayList<Sucursal_Producto> stock = null;
        try {//stock de un producto en todas las sucursales
            stock = ProductoNeg.Instancia().stockDeProducto(prod);
        } catch (Exception ex) {
        }
        return stock;
    }

    //COMPRAS
    @RequestMapping(value = "/compras", method = RequestMethod.GET)
    public String compras(ModelMap map) {
        map.addAttribute("titulo", "Listado de Compras");
        try {
            map.addAttribute("comprobantecompra", ComprobanteCompraNeg.Instancia().listarComprobanteCompra());
        } catch (Exception ex) {
        }
        return "logistica/compras";
    }

    @RequestMapping(value = "/detcompra/{compra}", method = RequestMethod.GET)
    public @ResponseBody
    ArrayList<Detalle_compra> detcompra(@PathVariable(value = "compra") String cod, ModelMap map) {
        ArrayList<Detalle_compra> detallecompra = null;
        try {
            detallecompra = ComprobanteCompraNeg.Instancia().listarDetalleCompra(cod);
        } catch (Exception ex) {
        }
        return detallecompra;
    }

    @RequestMapping(value = "/filtradodeProd", method = RequestMethod.GET)
    public @ResponseBody
    ArrayList<Producto> filtradoProducto(@RequestParam("q") String desc_prod) {
        ArrayList<Producto> producto = null;
        try {
            producto = ProductoNeg.Instancia().filtrarProductos(desc_prod);
        } catch (Exception ex) {
        }
        return producto;
    }

    @RequestMapping(value = "/frmcompras", method = RequestMethod.GET)
    public String frmcompras(ModelMap map) {
        map.addAttribute("titulo", "Formulario de Compras");

        return "logistica/frmCompras";
    }

    @RequestMapping(value = "/agregardetcompra", method = RequestMethod.POST)
    public @ResponseBody
    ArrayList<Detalle_compra> agregardetcompra(
            @RequestParam("idprod") int idprod, @RequestParam("cantidad") int cantidad,
            @RequestParam("precio") double precio, @RequestParam("importe") double importe,
            @RequestParam("descprod") String desc_prod, ModelMap map, HttpSession sesion) {
        ArrayList<Detalle_compra> detalle;
        if (sesion.getAttribute("detCompra") != null) {
            //Si ya existe atributo carrito en la sesion
            detalle = (ArrayList<Detalle_compra>) sesion.getAttribute("detCompra");
        } else {
            detalle = new ArrayList<>();
        }

        Detalle_compra dc = new Detalle_compra();
        Producto pr = new Producto();
        pr.setId_prod(idprod);
        pr.setDesc_prod(desc_prod);
        dc.setProducto(pr);
        dc.setCantidad(cantidad);
        dc.setPrecio(precio);
        dc.setImporte(importe);
        detalle.add(dc);

        map.addAttribute("detCompra", detalle);
        return detalle;
    }

    @RequestMapping(value = "/guardarCompra", method = RequestMethod.POST)
    public @ResponseBody
    int guardarCompra(
            @RequestParam("serie") String serie, @RequestParam("numero") String numero,
            @RequestParam("fecha") String fecha, @RequestParam("subTotal") double subTotal,
            @RequestParam("igv") double igv, @RequestParam("total") double total,
            @RequestParam("moneda") int moneda, @RequestParam("codProv") int idprov,
            @RequestParam("tipoComp") int tipocomp, HttpSession sesion, ModelMap map) {

        Comprobante_compra cc = new Comprobante_compra();
        cc.setSerie(serie);
        cc.setNumero(numero);
        cc.setFecha(fecha);
        cc.setSub_total(subTotal);
        cc.setMonto_igv(igv);
        cc.setTotal(total);
        cc.setMoneda(moneda);
        Proveedor p = new Proveedor();
        p.setId_prov(idprov);
        cc.setProveedor(p);
        Tipo_comprobante tp = new Tipo_comprobante();
        tp.setId_tipocomp(tipocomp);
        cc.setTipocomprobante(tp);
        Usuario u = new Usuario();
        u.setId_usu(1);
        cc.setUsuario(u);
        cc.setDetalle((ArrayList<Detalle_compra>) sesion.getAttribute("detCompra"));

        try {
            return ComprobanteCompraNeg.Instancia().guardarCompra(cc);
        } catch (Exception ex) {
        }
        return 0;
    }

    @RequestMapping(value = "/buscarProveedor", method = RequestMethod.POST)
    public @ResponseBody
    Proveedor buscarProveedor(@RequestParam("ruc") String ruc, @RequestParam("dni") String dni) {
        String tipo;
        String documento;
        if (ruc.equals("")) {
            tipo = "dni";
            documento = dni;
        } else {
            tipo = "ruc";
            documento = ruc;
        }
        try {
            return ProveedorNeg.Instancia().buscarProveedor(tipo, documento);
        } catch (SQLException ex) {
        }
        return null;
    }

    @RequestMapping(value = "/removerproductodetalle/{prod}", method = RequestMethod.GET)
    public @ResponseBody
    ArrayList<Detalle_compra> removerproductodetalle(@PathVariable(value = "prod") int prod, ModelMap map, HttpSession sesion) {
        ArrayList<Detalle_compra> detalle = null;
        try {
            detalle = (ArrayList<Detalle_compra>) sesion.getAttribute("detCompra");
            for (Detalle_compra dc : detalle) {
                if (dc.getProducto().getId_prod() == prod) {
                    detalle.remove(dc);
                }
            }
            map.addAttribute("detCompra", detalle);
        } catch (Exception ex) {
        }
        return detalle;
    }

}
